package com.spring.redis.operation.service.base.impl;

import com.spring.redis.operation.service.base.ListRedisBaseService;
import lombok.NonNull;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * redis Operation list class
 *
 * @author zhouyu
 */
@Service
public class ListRedisBaseServiceImpl extends RedisBaseServiceImpl implements ListRedisBaseService {

    private final ListOperations<String, Object> listOperations;

    public ListRedisBaseServiceImpl(RedisTemplate<String, Object> redisTemplate, ListOperations<String, Object> listOperations) {
        super(redisTemplate);
        this.listOperations = listOperations;
    }

    /**
     * 获取list缓存的内容
     *
     * @param key   键
     * @param start 开始
     * @param end   结束 0 到 -1代表所有值
     * @return java.util.List<Object>
     */
    @Override
    public List<Object> lGet(@NonNull String key, @NonNull Long start, @NonNull Long end) {
        return listOperations.range(key, start, end);
    }

    /**
     * 获取list缓存的长度
     *
     * @param key 键
     * @return java.lang.Long list长度
     */
    @Override
    public Long lGetListSize(@NonNull String key) {
        return listOperations.size(key);
    }

    /**
     * 通过索引 获取list中的值
     *
     * @param key   键
     * @param index 索引 index>0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return java.lang.Object
     */
    @Override
    public Object lGetIndex(@NonNull String key, @NonNull Long index) {
        return listOperations.index(key, index);
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @return java.lang.Long
     */
    @Override
    public Long lRPush(@NonNull String key, @NonNull Object value) {
        return listOperations.rightPush(key, value);
    }

    /**
     * 将list放入缓存
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return java.lang.Long
     */
    @Override
    public Long lRPush(@NonNull String key, @NonNull Object value, @NonNull Long time) {
        Long aLong = lRPush(key, value);
        if (aLong > 0) {
            expire(key, time);
        }
        return aLong;
    }

    /**
     * 将list放入缓存
     *
     * @param key    键
     * @param values 值
     * @return java.lang.Long
     */
    @Override
    public Long lRPushAll(@NonNull String key, @NonNull List<Object> values) {
        return listOperations.rightPushAll(key, values);
    }

    /**
     * 将list放入缓存
     *
     * @param key    键
     * @param values 值
     * @param time   时间(秒)
     * @return java.lang.Long
     */
    @Override
    public Long lRPushAll(@NonNull String key, @NonNull List<Object> values, @NonNull Long time) {
        Long aLong = lRPush(key, values);
        if (aLong > 0) {
            expire(key, time);
        }
        return aLong;
    }

    /**
     * 根据索引修改list中的某条数据
     *
     * @param key   键
     * @param index 索引
     * @param value 值
     */
    @Override
    public void lUpdateIndex(@NonNull String key, @NonNull Long index, @NonNull Object value) {
        listOperations.set(key, index, value);
    }

    /**
     * 移除N个值为value
     *
     * @param key   键
     * @param count 移除多少个
     * @param value 值
     * @return java.lang.Long 移除的个数
     */
    @Override
    public Long lRemove(@NonNull String key, @NonNull Long count, @NonNull Object value) {

        return listOperations.remove(key, count, value);
    }

    /**
     * 返回和移除列表的第一个元素
     *
     * @param key key
     * @return Object
     */
    @Override
    public Object lPop(String key) {
        return listOperations.leftPop(key);
    }
}
